﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Libreria.SICOM.Negocio;
using Libreria.SICOM.Modelo;
using System.Configuration;
using Web.SICOM.Models;
using System.Xml.Serialization;
using System.IO;
using System.Web.UI.DataVisualization.Charting;
using System.Drawing;

namespace Web.SICOM.Controllers
{
    public class ReporteController : Controller
    {
        //
        // GET: /Reporte/

        public ActionResult Index()
        {
            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            List<Muestra> muestras = new MuestraNegocio().consultarMuestras(100, cdc);
            Muestrasreporte final = new Muestrasreporte();

            foreach (var muestra in muestras)
            {
                Muestramod MuestraTemp = new Muestramod();
                MuestraTemp.Codigo = muestra.Identificador;

                ProyectoNegocio proyectoaBuscar = new ProyectoNegocio();
                MuestraTemp.Proyecto = ((Proyecto)proyectoaBuscar.ConsultarPorIdentificador(muestra.Iddeproyecto, cdc)).Nombre;

                LugarNegocio LugaraBuscar = new LugarNegocio();
                MuestraTemp.Lugar = ((Lugar)LugaraBuscar.ConsultarPorIdentificador(muestra.Iddelugar, cdc)).Nombre;
                MuestraTemp.Fecha = muestra.Fechadecaptura;

                EquipodeMedicionNegocio equipoaBuscar = new EquipodeMedicionNegocio();
                MuestraTemp.Equipodemedicion = ((EquipodeMedicion)equipoaBuscar.consultarPorIdentificador(muestra.Iddeequipo, cdc)).Nombre;
                TipodeMuestraNegocio tipodemuestraaBuscar = new TipodeMuestraNegocio();
                MuestraTemp.TipoMuestra = ((TipodeMuestra)tipodemuestraaBuscar.consultarPorIdentificador(muestra.Idtipodemuestra, cdc)).Nombre;
                VariableNegocio variableaBuscar = new VariableNegocio();
                Variable nuevavariable = variableaBuscar.ConsultarPorIdentificador(muestra.Iddevariable, cdc);
                MuestraTemp.Variable = nuevavariable.Nombre;
                MuestraTemp.Valor = muestra.Valor;
                UnidaddeMedidaNegocio unidadaBuscar = new UnidaddeMedidaNegocio();
                MuestraTemp.Unidad = ((UnidaddeMedida)unidadaBuscar.consultarPorIdentificador(nuevavariable.Unidad, cdc)).Nombre;

                final.listademuestras.Add(MuestraTemp);
            }

            final.tiposdemuestra = new TipodeMuestraNegocio().consultarTiposdeMuestra(cdc);
            final.proyectos = new ProyectoNegocio().ConsultarProyectos(cdc);
            final.lugares = new LugarNegocio().consultarLugares(cdc);
            final.equipos = new EquipodeMedicionNegocio().consultarEquiposdeMedicion(cdc);
            final.variables = new VariableNegocio().consultarVariables(cdc);
            ViewData.Model = final;
            if (((Muestrasreporte)ViewData.Model).listademuestras.Count == 0)
            {
                ViewData.Model = "No Hay Reporte  de Muestras Asociados";
            }
            return View(final);
            /* mismo condicional con modelo de equipos,lugares,proyectosy variables
            if (((MuestraModelo)ViewData.Model).tiposdemuestra.Count == 0)
            {
                ViewData.Model = "No Hay Datos de tipos de muestra Asociados";
            }
            code agregado*/

        }

        [HttpPost]
        public ActionResult Index(Boolean Automatico, Boolean Manual, String Fecha, String FechaFinal, Muestra muestra)
        {
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            Boolean automatico = Automatico;
            Boolean maual = Manual;
            Int32? idtipomuestra = muestra.Idtipodemuestra;
            Int32? idtipoproyecto = muestra.Iddeproyecto;
            Int32? idtipodelugar = muestra.Iddelugar;
            Int32? iddeequipo = muestra.Iddeequipo;
            Int32? iddevariable = muestra.Iddevariable;
            String mac = muestra.Mac;
            DateTime fechainicial = DateTime.MinValue; //nulo
            DateTime fechafinal = DateTime.MinValue;
            if (!String.IsNullOrWhiteSpace(Fecha))
            {
                fechainicial = Convert.ToDateTime(Fecha);
            }
            if (!String.IsNullOrWhiteSpace(FechaFinal))
            {
                fechafinal = Convert.ToDateTime(FechaFinal);
            }
            List<Muestra> muestras = new MuestraNegocio().ConsultarReporte(automatico, maual, idtipomuestra, idtipoproyecto, idtipodelugar, fechainicial,
            fechafinal, iddeequipo, mac, iddevariable, cdc);

            Muestrasreporte final = new Muestrasreporte();

            foreach (var muestrax in muestras)
            {
                Muestramod MuestraTemp = new Muestramod();
                MuestraTemp.Codigo = muestrax.Identificador;

                ProyectoNegocio proyectoaBuscar = new ProyectoNegocio();
                MuestraTemp.Proyecto = ((Proyecto)proyectoaBuscar.ConsultarPorIdentificador(muestrax.Iddeproyecto, cdc)).Nombre;

                LugarNegocio LugaraBuscar = new LugarNegocio();
                MuestraTemp.Lugar = ((Lugar)LugaraBuscar.ConsultarPorIdentificador(muestrax.Iddelugar, cdc)).Nombre;
                MuestraTemp.Fecha = muestrax.Fechadecaptura;

                EquipodeMedicionNegocio equipoaBuscar = new EquipodeMedicionNegocio();
                MuestraTemp.Equipodemedicion = ((EquipodeMedicion)equipoaBuscar.consultarPorIdentificador(muestrax.Iddeequipo, cdc)).Nombre;
                TipodeMuestraNegocio tipodemuestraaBuscar = new TipodeMuestraNegocio();
                MuestraTemp.TipoMuestra = ((TipodeMuestra)tipodemuestraaBuscar.consultarPorIdentificador(muestrax.Idtipodemuestra, cdc)).Nombre;
                VariableNegocio variableaBuscar = new VariableNegocio();
                Variable nuevavariable = variableaBuscar.ConsultarPorIdentificador(muestrax.Iddevariable, cdc);
                MuestraTemp.Variable = nuevavariable.Nombre;
                MuestraTemp.Valor = muestrax.Valor;
                UnidaddeMedidaNegocio unidadaBuscar = new UnidaddeMedidaNegocio();
                MuestraTemp.Unidad = ((UnidaddeMedida)unidadaBuscar.consultarPorIdentificador(nuevavariable.Unidad, cdc)).Nombre;
                final.listademuestras.Add(MuestraTemp);
            }

            final.tiposdemuestra = new TipodeMuestraNegocio().consultarTiposdeMuestra(cdc);
            final.proyectos = new ProyectoNegocio().ConsultarProyectos(cdc);
            final.lugares = new LugarNegocio().consultarLugares(cdc);
            final.equipos = new EquipodeMedicionNegocio().consultarEquiposdeMedicion(cdc);
            final.variables = new VariableNegocio().consultarVariables(cdc);
            ViewData.Model = final;
            if (((Muestrasreporte)ViewData.Model).listademuestras.Count == 0)
            {
                ViewData.Model = "No Hay Reporte  de Muestras Asociados";
            }
            return View(final);
        }

        [HttpGet]
        public ActionResult Lugar(Int32? idlugar, Int32? idvariable)
        {

            int numeroRegistros = int.Parse(ConfigurationManager.AppSettings["numeroRegistros"].ToString());
            Muestrasreporte final = new Muestrasreporte();

            final = filtrardatos(idlugar, idvariable, numeroRegistros);
            
            ViewData.Model = final;
            @ViewData["idlugar"] = idlugar;
            @ViewData["idvariable"] = idvariable;
            if (((Muestrasreporte)ViewData.Model).listademuestras.Count == 0)
            {
                ViewData.Model = "No Hay Reporte  de Muestras Asociados";
            }
            return View(final);

        }

        public Muestrasreporte filtrardatos(Int32? idlugar,Int32? idvariable, int numeroRegistros)
        {
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            List<Muestra> muestras = new List<Muestra>();


            muestras = new MuestraNegocio().consultarMuestrasxlugaryvariable(idlugar, idvariable, numeroRegistros, cdc);
            Muestrasreporte final = new Muestrasreporte();

            foreach (var muestra in muestras)
            {
                Muestramod MuestraTemp = new Muestramod();

                ProyectoNegocio proyectoaBuscar = new ProyectoNegocio();
                MuestraTemp.Proyecto = ((Proyecto)proyectoaBuscar.ConsultarPorIdentificador(muestra.Iddeproyecto, cdc)).Nombre;

                LugarNegocio LugaraBuscar = new LugarNegocio();
                MuestraTemp.Lugar = ((Lugar)LugaraBuscar.ConsultarPorIdentificador(muestra.Iddelugar, cdc)).Nombre;
                MuestraTemp.Fecha = muestra.Fechadecaptura;

                EquipodeMedicionNegocio equipoaBuscar = new EquipodeMedicionNegocio();
                MuestraTemp.Equipodemedicion = ((EquipodeMedicion)equipoaBuscar.consultarPorIdentificador(muestra.Iddeequipo, cdc)).Nombre;
                TipodeMuestraNegocio tipodemuestraaBuscar = new TipodeMuestraNegocio();
                MuestraTemp.TipoMuestra = ((TipodeMuestra)tipodemuestraaBuscar.consultarPorIdentificador(muestra.Idtipodemuestra, cdc)).Nombre;
                VariableNegocio variableaBuscar = new VariableNegocio();
                Variable nuevavariable = variableaBuscar.ConsultarPorIdentificador(muestra.Iddevariable, cdc);
                MuestraTemp.Variable = nuevavariable.Nombre;
                MuestraTemp.Valor = muestra.Valor;
                UnidaddeMedidaNegocio unidadaBuscar = new UnidaddeMedidaNegocio();
                MuestraTemp.Unidad = ((UnidaddeMedida)unidadaBuscar.consultarPorIdentificador(nuevavariable.Unidad, cdc)).Nombre;
                final.listademuestras.Add(MuestraTemp);
            }

            final.listademuestras.Sort(new Comparison<Muestramod>(

            delegate(Muestramod a, Muestramod b)
            {
                return DateTime.Compare((DateTime)b.Fecha, (DateTime)a.Fecha);
            }));

            return final;
        }

        public ActionResult ObtenerMisEnviosXmlExcel(Int32? idlugar, Int32? idvariable)
        {

            Muestrasreporte final = new Muestrasreporte();
            int numeroRegistros = int.Parse(ConfigurationManager.AppSettings["numeroRegistros"].ToString());
            final = filtrardatos(idlugar, idvariable, numeroRegistros);

            var stream = new MemoryStream();
            var serialicer = new XmlSerializer(typeof(List<Muestramod>));

            //Lo transformo en un XML y lo guardo en memoria
            serialicer.Serialize(stream, final.listademuestras);
            stream.Position = 0;

            //devuelvo el XML de la memoria como un fichero .xls
            return File(stream, "application/vnd.ms-excel", "Muestra.xls");

        }

        public ActionResult GetChart(Int32? idlugar, Int32? idvariable)
        {
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            Muestrasreporte final = new Muestrasreporte();
            string unidaddemedida=null;
            string nombredevariable = null;
            int numeroRegistros = int.Parse(ConfigurationManager.AppSettings["numeroRegistros"].ToString());
            final = filtrardatos(idlugar, idvariable, numeroRegistros);
            foreach (var muestra in final.listademuestras)
            {
                unidaddemedida = muestra.Unidad;
                nombredevariable = muestra.Variable;
             }
           var chart = new Chart
                                {
                                    Height = 296,
                                    Width = 570,//valor anterior de 612
                                    BorderWidth = 2,
                                    ImageType = ChartImageType.Png,
                                    BackColor = ColorTranslator.FromHtml("#F3DFC1"),
                                    BorderlineDashStyle = ChartDashStyle.Solid,
                                    //BackGradientStyle = GradientStyle.LeftRight,
                                    BorderColor = Color.FromArgb(181, 64, 1),
                                    BorderSkin = { SkinStyle = BorderSkinStyle.Sunken },
                                };
            //Chart Area
            var chartArea = chart.ChartAreas.Add("chartArea");
            chartArea.BorderColor = Color.FromArgb(64, 64, 64, 64);
            chartArea.BackSecondaryColor = Color.White;
            chartArea.BackColor = Color.OldLace;
            chartArea.ShadowColor = Color.Transparent;
            chartArea.AxisY.Title = "Unidad de medida" + " " + "("+unidaddemedida+")";
            chartArea.AxisX.Title = "Fechas";
            //estilos de color y fuente para la etiqueta eje y
            chartArea.AxisY.TitleForeColor = ColorTranslator.FromHtml("#497155");
            chartArea.AxisY.TitleFont = new Font("Arial", 10);
            //estilos de color y fuente para la etiqueta eje x
            chartArea.AxisX.TitleForeColor = ColorTranslator.FromHtml("#497155");
            chartArea.AxisX.TitleFont = new Font("Arial", 10);
            var titulo = chart.Titles.Add("Reporte Grafico de  Muestras ");
            var legenda = chart.Legends.Add("Coloca");

            var serie = chart.Series.Add(nombredevariable);
            serie.ChartType = SeriesChartType.Line;
            int i = 0;
            List<RangodeCualidad> rangosdecualidad = new RangodeCualidadNegocio().consultarRangosdeCualidadporvariable(idvariable, cdc);
            if (rangosdecualidad.Count != 0)
            {
                foreach (var muestra in final.listademuestras)
                {
                   i++;
                   foreach (var rangodeCualidad in rangosdecualidad)
                   {
                       if (rangodeCualidad.Valor == muestra.Valor)
                      {
                          serie.Points.Add(new DataPoint(i, rangodeCualidad.Identificador.ToString()) { AxisLabel = muestra.Fecha.ToString().Substring(0, 10) }); 
                      }
                   }
                }
            }
            else
            {
                for (int pointIndex = 0; pointIndex < final.listademuestras.Count; pointIndex++)
                {
                    i++;
                    serie.Points.Add(new DataPoint(i, final.listademuestras[pointIndex].Valor) { AxisLabel = final.listademuestras[pointIndex].Fecha.ToString().Substring(0, 10) });
                }
          
            }
            var memoryStream = new MemoryStream();
            chart.SaveImage(memoryStream);
            return File(memoryStream.GetBuffer(), @"image/png");
        }




    }



}
